package com.ssy.lingxi.order.service.web;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.DeliveryNoticeOrderDO;
import com.ssy.lingxi.order.entity.DeliveryOrderDO;
import com.ssy.lingxi.order.entity.DeliveryPlanDO;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.vo.basic.request.*;
import com.ssy.lingxi.order.model.vo.basic.response.*;
import com.ssy.lingxi.order.model.vo.common.request.LogisticsAddressVO;
import org.springframework.http.HttpHeaders;

import java.util.List;

/**
 * 送货计划,送货通知单相关接口
 * @author czh
 * @version 2.0.0
 * @date 2021-07-20
 */
public interface IDeliveryPlanService {

    /**
     * 送货计划-创建送货计划
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 查询结果
     */
    Wrapper<Void> createDeliveryPlan(HttpHeaders headers, DeliveryPlanCreateVO param,Integer type);

    /**
     * 送货计划-修改送货计划
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> updateDeliveryPlan(HttpHeaders headers, DeliveryPlanUpdateVO param);

    /**
     * 送货计划-删除送货计划
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> deleteDeliveryPlan(HttpHeaders headers, IdVO param);

    /**
     * 送货计划-生成通知单所需数据
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<NoticeOrderParamByPlanVO> NoticeOrderByPlanCreate(HttpHeaders headers, NoticeOrderByPlanCreateVO param);

    /**
     * 送货计划-生成送货单所需数据
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<DeliveryOrderCreateByPlanVO> DeliveryOrderByPlanCreate(HttpHeaders headers, DeliveryOrderByPlanCreateVO param);

    /**
     * 送貨通知單-生成送货单所需数据
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 操作结果
     */
    Wrapper<DeliveryOrderCreateByPlanVO> DeliveryOrderByNoticeCreate(HttpHeaders headers, IdVO idVO);

    /**
     * 送货计划-查询计划周期内的计划送货物料
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<DeliveryPlanProductQueryVO>> pagePlanProducts(HttpHeaders headers, DeliveryPlanProductPageVO pageVO);

    /**
     * 送货计划-获取送货计划详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<List<DeliveryOuterHistoryVO>> deliveryHistory(HttpHeaders headers, IdVO idVO,Integer code);

    /**
     * 送货计划-确认送货计划
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> confirmDeliveryPlan(HttpHeaders headers, DeliveryVerifyVO param);

    /**
     * 送货计划-送货计划详情中物料信息
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<PageData<DeliveryPlanProductQueryVO>> getDeliveryPlanProductDetail(HttpHeaders headers, IdPageVO param);

    /**
     * 送货计划-供应商送货计划详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<DeliveryPlanDetailVO> getVendorDeliveryPlanDetail(HttpHeaders headers, IdVO idVO);

    /**
     * 送货计划-采购商获取送货计划详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<DeliveryPlanDetailVO> getBuyerDeliveryPlanDetail(HttpHeaders headers, IdVO idVO);


    /**
     *  送货计划-获取送货计划详情
     * @param headers Http头部信息
     * @param param    接口参数
     * @return 操作结果
     */
    Wrapper<DeliveryPlanDetailVO> getDeliveryPlanDetail(HttpHeaders headers, DeliveryPlanDO param);

    /**
     * 送货计划-获取送货计划详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<DeliveryPlanDetailVO> getDeliveryPlanDetail(HttpHeaders headers, IdVO idVO);

    /**
     * 送货计划-供应商查询送货计划
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<DeliveryPlanQueryVO>> pageVendorDeliveryPlan(HttpHeaders headers, DeliveryPlanPageVO pageVO);

    /**
     * 送货计划-采购商查询送货计划
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @param type DeliveryOrderTypeStatusEnum
     * @return 查询结果
     */
    Wrapper<PageData<DeliveryPlanQueryVO>> pageBuyerDeliveryPlan(HttpHeaders headers, DeliveryPlanPageVO pageVO,Integer type);

    /**
     * 送货通知单-供应商查询送货通知单
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<NoticeOrderQueryVO>> pageVendorNoticeOrder(HttpHeaders headers, NoticeOrderPageVO pageVO);

    /**
     * 送货通知单-采购商查询送货通知单
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<NoticeOrderQueryVO>> pageBuyerNoticeOrder(HttpHeaders headers, NoticeOrderPageVO pageVO);

    /**
     * 送货通知单-获取送货通知单详情
     * @param headers Http头部信息
     * @param order    接口参数
     * @return 操作结果
     */
    Wrapper<NoticeOrderDetailVO> getNoticeOrderDetail(HttpHeaders headers, DeliveryNoticeOrderDO order);

    /**
     * 送货通知单-获取送货通知单详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<NoticeOrderDetailVO> getNoticeOrderDetail(HttpHeaders headers, IdVO idVO);

    /**
     * 送货通知单-采购商获取送货通知单详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<NoticeOrderDetailVO> getBuyerNoticeOrderDetail(HttpHeaders headers, IdVO idVO);

    /**
     * 送货通知单-供应商获取送货通知单详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<NoticeOrderDetailVO> getVendorNoticeOrderDetail(HttpHeaders headers, IdVO idVO);

    /**
     * 送货通知单-查询送货通知单送货物料列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<NoticeOrderProductQueryVO>> pageNoticeOrderProducts(HttpHeaders headers,NoticeOrderIdPageVO pageVO);

    /**
     * 送货通知单-创建送货通知单
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> createNoticeOrder(HttpHeaders headers, NoticeOrderParamVO param, Integer type);

    /**
     * 送货通知单-确认送货通知单
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> confirmNoticeOrder(HttpHeaders headers, DeliveryVerifyVO param);

    /**
     * 送货通知单-修改送货通知单
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> updateNoticeOrder(HttpHeaders headers, DeliveryNoticeOrderUpdateVO param);

    /**
     * 送货通知单-作废送货通知单
     * @param headers Http头部信息
     * @param param 接口参数
     * @return 操作结果
     */
    Wrapper<Void> invalidNoticeOrder(HttpHeaders headers, DeliveryInvalidVO param);

    /**
     * 送货计划 - 新增订单时新增送货计划物料数据（内部接口）
     * @param order 订单
     */
    void saveDeliveryPlanProduct(OrderDO order);

    /**
     * 送货计划 - 中止，取消订单时删除送货计划物料数据（内部接口）
     * @param order 订单
     */
    void removeDeliveryPlanProduct(OrderDO order);

    /**
     * 修改送货单关联送货计划配送物料订单状态（内部接口）
     * @param loginUser 会员信息
     * @param order 订单
     * @param status DeliveryOrderOuterStatusEnum 只针对 1-已提交 和 3-已作废 两个状态生效
     */
    void updateDeliveryPlanStatus(UserLoginCacheDTO loginUser, DeliveryOrderDO order, Integer status);

    /**
     * 修改送货单关联送货通知单状态（内部接口）
     * @param loginUser 会员信息
     * @param order 订单
     * @param status DeliveryOrderOuterStatusEnum 只针对 1-已提交 和 3-已作废 两个状态生效
     */
    void updateNoticeOrderStatus(UserLoginCacheDTO loginUser, DeliveryOrderDO order, Integer status);

    /**
     * 通过订单商品id更新对应id的送货计划物料订单数量（内部接口）
     * @param orderProductIds
     */
    void updateDeliveryPlanOrder(List<Long> orderProductIds);

    /**
     * 根据单据编号和单据类型获取收货地址(如果是送货计划则需要传orderProductId)
     * @param sourceNo 单据编号
     * @param sourceType 单据类型
     * @return 收货地址
     */
    LogisticsAddressVO getReceiveAddressBySourceNoOrOrderProductId(String sourceNo,Integer sourceType,Long orderProductId);

    /**
     * 送货计划 - 提交送货计划
     * @param headers Http头部信息
     * @param request 送货计划id
     */
    Wrapper<Void> submitDeliveryPlan(HttpHeaders headers, IdVO request);
}
